package com.ygqh.baby.service;

import com.foxinmy.weixin4j.mp.model.User;
import com.ygqh.baby.ao.*;
import com.ygqh.baby.model.YgUserModel;
import com.ygqh.baby.model.YgUserRecommendModel;
import com.ygqh.baby.model.YgUserStatisticsModel;
import com.ygqh.baby.po.YgUser;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface YgUserService {

	List<YgUser> find();

	int findCount();

	List<YgUser> find(Date startDate, Date endDate);

	YgUser findById(Long id);

	int deleteSoft(Long[] ids);

	int deleteSoft(Long id);

	int save(YgUser ygUser);

	int update(YgUser ygUser);

	int saveOrUpdate(YgUser ygUser);

	/**
	 * @param queryInfo
	 * @param phone
	 * @param nickName
	 * @param startTime 注册时间区间
	 * @param endTime   注册时间区间
	 * @param q
	 * @return
	 */
	ResultSet<YgUser> search(QueryInfo queryInfo, String phone, String nickName, Date startTime, Date endTime, String q, String fromCode, String groupTag,
							 UserType userType);

	YgUser findByUserName(String username);

	/**
	 * 保存验证码到redis
	 *
	 * @param username
	 * @param validateCode
	 * @param expire       存活时间，单位是毫秒
	 */
	void saveValidateCodeToRedis(String username, ValidateCode validateCode, int expire);

	ValidateCode selectValidateCodeToRedis(String username);

	/**
	 * 我的页面 修改用户信息
	 *
	 * @param userId       用户id
	 * @param userLogo     用户头像
	 * @param nickName     用户昵称
	 * @param babyGender   宝宝性别 0男1女
	 * @param babyBirthday 宝宝生日
	 * @return
	 */
	int updateUserInfo(Long userId, String userLogo, String nickName, Integer babyGender, Date babyBirthday);

	/**
	 * 新增用户统计
	 *
	 * @param queryInfo
	 * @param startDate
	 * @param endDate
	 * @param sourceCode
	 * @param q
	 * @return
	 */
	ResultSet<YgUserStatisticsModel> searchUserStatistics(QueryInfo queryInfo, Date startDate, Date endDate, String sourceCode, String q);

	List<YgUserStatisticsModel> findUserStatistics(QueryInfo queryInfo, Date startDate, Date endDate, String sourceCode, String q);

	/**
	 * 个人中心获取用户信息
	 *
	 * @param userId
	 * @return
	 */
	YgUserModel findUserInfo(Long userId);

	/**
	 * 绑定openId和unionId
	 *
	 * @param userId
	 * @param openid
	 * @param smallOpenId
	 * @param unionId
	 * @return
	 */
	int bindingOpenId(Long userId, String openid, String smallOpenId, String unionId);

	/**
	 * 查找用户通过openid
	 *
	 * @param openId
	 * @return
	 */
	YgUser findByOpenId(String openId);

	/**
	 * M站获取用户统计
	 *
	 * @param sourceCode
	 * @return
	 */
	List<YgUserStatisticsModel> findUserGrouBySourceCode(String sourceCode);

	int updateUserInfo(YgUser ygUser);

	/**
	 * 获取联盟用户统计列表
	 *
	 * @param queryInfo
	 * @param startDate
	 * @param endDate
	 * @param sourceCode
	 * @return
	 */
	List<Map<String, Object>> findUserStatisticsLM(Date startDate, Date endDate, String sourceCode);

	/**
	 * 晒单引导是否第一次显示
	 *
	 * @param userId
	 * @return
	 */
	Boolean isGuide(Long userId);

	YgUser findBySourceCode(String sourceCode);

	/**
	 * 是否为新客
	 *
	 * @param id
	 * @return
	 */
	@Deprecated
	Boolean isNewCustom(Long id);
	Boolean isNewCustom(Long userId, String platformNo);

	int updateUserBySourceCode(YgUser user);

	/**
	 * 成为推广员
	 *
	 * @param userId
	 * @return
	 */
	int becomeSeller(Long userId);

	/**
	 * 查询下单用户数
	 *
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	Long findPaidUsersCount(Date startTime, Date endTime);

	/**
	 * 查询下单新用户数
	 *
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	Long findPaidNewUsersCount(Date startTime, Date endTime);

	/**
	 * 根据uuid获取用户信息
	 *
	 * @param uuid
	 * @return
	 */
	YgUser findByUuid(String uuid);

	YgUser register(String username, String password, String fromCode, String defaultHeadUrl, String defaultNickNamePrefix);

	// ===============================

	/**
	 * 修复用户表unionId
	 *
	 * @param users
	 * @return
	 */
	int repairUnionIdBatch(List<User> users);

	List<String> findOpenIds(Long start, Long end);

	List<YgUser> findUsersByUserNames(List<String> username);

	/**
	 * 统计 M站 代理用户推荐用户数
	 */
	int findUserRecommendCount(String fromCode, String groupTag);

	List<YgUserRecommendModel> findUserRecommend(QueryInfo queryInfo, String fromCode, String groupTag);

	List<YgUser> selectCountOpen(QueryInfo queryInfo, Long couponId);

	int findCountOpen(Long couponId);

	List<YgUser> selectUserByPage(QueryInfo queryInfo);

	int findCountById();

	YgUser findByUserName(String username, UserType userType);

	int findNewCountByFromCode(String[] sourceCodes, Date startDate, Date endDate);

	int updateSubscribeStatus(String openId, Boolean isSubscribe);

	int updateSubscribeStatusBatch(List<String> openIds, boolean b);

	YgUser findLastUser();

	int updateUserLevel(Long userId, int level, Date birthDay);

	/**
	 * 只适用老女王（拥有免邮特权的一批女王）
	 * @param userId
	 * @return
	 */
	@Deprecated
	Boolean isVip(Long userId);

	/**
	 * 临时接口
	 *
	 * @param 入参
	 * @param isSubscribe
	 * @return void 返回类型
	 * @throws @date 2017年11月11日 上午10:39:26
	 * @Title: sendMsg11buquan
	 * @Description: TODO(这里用一句话描述这个方法的作用)
	 * @author （guohao）
	 * @version V1.0
	 */
	List<YgUser> send11buquan(Boolean isSubscribe);

	/**
	 * 不含团长
	 *
	 * @param userId
	 * @return
	 */
	Boolean isUserAgent(Long userId);

	Boolean isUserGroup(Long userId);

	YgUser findGroupHead(String groupTag);

	List<YgUser> findGroupUser(String groupTag, Boolean exitGroupHead);

	int updateAgentToCancelByUserId(Long userId);

	Boolean isNewCustom(Long userId, Long orderId);

	/**
	 * 将原用户数据转移到目标用户
	 *
	 * @param sourceUser
	 * @param targetUser
	 * @return Message    返回类型
	 * @throws
	 * @Title: transferData
	 * @author （guohao）
	 * @date 2018年5月10日 下午6:24:38
	 * @version V1.0
	 */
	Message transferData(YgUser sourceUser, YgUser targetUser);

	/**
	 * @param userType 用户类型
	 * @return
	 */
	List<YgUser> findByUserType(UserType userType);

	/**
	 * 修改用户类型
	 *
	 * @param userType
	 * @param id
	 * @return
	 */
	int updateUserType(UserType userType, Long id);

	/**
	 * @param userId
	 * @return Boolean    返回类型
	 * @throws
	 * @Title: isVipNew
	 * @author （guohao）
	 * @date 2018年5月28日 上午10:32:44
	 * @version V1.0
	 */
	@Deprecated
	Boolean isVipNew(Long userId);
	Boolean isVipNew(Long userId, String platformNo);

	List<YgUser> findByLevel(Integer level);

	/**
	 * 返回用户 openid，smallOpenid， uuid
	 *
	 * @param userId
	 * @return YgUser    返回类型
	 * @throws
	 * @Title: findOpenId
	 * @author （guohao）
	 * @date 2018年5月31日 下午2:11:06
	 * @version V1.0
	 */
	YgUser findOpenId(Long userId);

	int updateWxData(Long userId, String openId, String smallOpenId, String uuid, String nickName, String headImageUrl, String fromCode);

	/***
	 * 查询公众号新用户列表
	 * @param startDate
	 * @return
	 */
	List<YgUser> selectNewUserList(Date startDate);

	/**
	 * 拥有指定优惠券（未使用、未过期）的用户（绑定openId、关注公众号）
	 *
	 * @param couponIdList
	 * @return
	 */
	List<YgUser> findOpenIdsByUnUsedCouponId(List<Long> couponIdList);

	List<YgUser> findOpenIdsByUnUsedCouponId(List<Long> couponIdList, Date createStartTime);

	/**
	 * 指定时间以前下过单，指定时间以后没有下过单的用户（绑定openId、关注公众号）
	 * 过滤supplierId=32的订单
	 *
	 * @param startDate
	 * @return
	 */
	List<YgUser> findOpenIdByNotOrderWithOrderTime(Date startDate);

	/**
	 * 指定时间以后注册并且没下过单的用户（绑定openId、关注公众号）
	 *
	 * @param startDate
	 * @return
	 */
	List<YgUser> findOpenIdByNotOrderWithRegisterTime(Date startDate);

	/**
	 * @param field     指定返回字段		例："id, user_name, open_id, is_subscribe"
	 * @param level     老女王
	 * @param onlyNew   仅新用户
	 * @param startDate 限制注册开始时间
	 * @param userType  限制用户类型
	 * @return
	 */
	List<YgUser> findWithField(String field, Integer level, boolean onlyNew, Date startDate, String... userType);

    List<YgUser> findWithField(String field, Integer level, boolean onlyNew, boolean isSubscribe,
                               boolean hasOpenId, Date startDate, String... userType);

    /**
	 * @param idList 为null或空，查全部用户
	 * @return
	 */
	List<YgUser> findOpenIds(List<Long> idList);

	/**
	 * 关注未注册用户
	 *
	 * @return
	 */
	List<String> findOpenIdByNotRegister();

	/**
	 * 是否新用户（指定销售平台, 指定下单开始时间）
	 *
	 * @param userId    用户id
	 * @param startTime 指定开始时间
	 * @return
	 */
	Boolean isNewCustom(Long userId, String platformNo, Date startTime);

	/**
	 * 在壹家店是否为新客
	 * @param userId
	 * @return
	 */
	Boolean isNewCustomByYijiadian(Long userId);

	String getSourceCodeByShareCode(String shareCode);

	int updateFromCode(String oldFromCode, String newFromCode);
}
